/*
 * Jogador.cpp
 *
 *  Created on: 24/11/2011
 *      Author: Arthur Holanda
 */

#include "model/Jogador.h"
#include "model/Acao.h"
#include "model/InteligenciaAntiga.h"
#include "model/InteligenciaPerfil2.h"
#include "model/InteligenciaPerfil3.h"

using namespace Osp::Base::Utility;

Jogador::Jogador() {
	inteligencia = null;
	ultimaAcao = null;
}

Jogador::~Jogador() {
	if (mao) {
		delete mao;
	}

	if (inteligencia) {
		delete inteligencia;
	}
}

void Jogador::Construct(String nome, int dinheiro) {
	this->nome = nome;
	this->dinheiro = dinheiro;
	this->mao = new Mao();
//	CriaInteligencia();
}

void Jogador::TerminarRodada() {
}

String Jogador::GetNome() {
	return this->nome;
}

int Jogador::GetApostaRodada() {
	return apostaRodada;
}

void Jogador::TerminouJogada() {
}

bool Jogador::PodeApostar(int valor) {
	return (dinheiro >= valor);
}

void Jogador::IniciarPartida() {
	apostaRodada = 0;
	apostaTotal = 0;
	status = JOGANDO;
	mao->LimparMao();
	ultimaAcao = null;

	CriaInteligencia();
}

void Jogador::AumentarApostaEm(int valor) {
	apostaRodada += valor;
	dinheiro -= valor;
	ultimaAcao = new Acao(APOSTAR, apostaRodada);
}

void Jogador::Apostar(int valor) {
	apostaRodada = valor;
	dinheiro -= valor;

	ultimaAcao = new Acao(APOSTAR, apostaRodada);
}

int Jogador::GetDinheiro() {
	return dinheiro;
}

void Jogador::Receber(int valor) {
	this->dinheiro += valor;
}

void Jogador::PuxarCarta() {
	Carta* c = this->controlador->GetBaralho()->DarCarta();
	this->mao->PegarCarta(c);
}

int Jogador::GetId() {
	return id;
}

Mao *Jogador::GetMao() {
	return mao;
}

void Jogador::ApostarTudo() {
	apostaRodada += dinheiro;
	dinheiro = 0;

}

void Jogador::Cobrir() {
	AppLog("Maior Aposta: %d", controlador->GetMaiorApostaRodada());
	AumentarApostaPara(controlador->GetMaiorApostaRodada());
}

void Jogador::CriaInteligencia()
{
	int result;
	result = Math::Rand() % 3;
	if (result > 1) {
		AppLog("perfil 1 criado");
		inteligencia = new InteligenciaAntiga(this);
	} else if (result > 0) {
		AppLog("perfil 2 criado");
		inteligencia = new InteligenciaPerfil2(this);
	} else {
		AppLog("perfil 3 criado");
		inteligencia = new InteligenciaPerfil3(this);
	}
}

Acao* Jogador::Jogar() {
	if(inteligencia == null){
		CriaInteligencia();
	}

	Acao* acao = inteligencia->GetAcao();

	switch (acao->acao) {
		case PASSAR:
			this->Passar();
			break;
		case DESISTIR:
			this->Desistir();
			break;
		case COBRIR:
			this->Cobrir();
			break;
		case APOSTAR:
			this->Apostar(acao->valor);
		case AUMENTAR:
			this->AumentarApostaPara(acao->valor);
		default:
			break;
	}

	return acao;
}

void Jogador::IniciarRodada() {
	ultimaAcao = null;
	apostaRodada = 0;
}

void Jogador::Desistir() {
	ultimaAcao = new Acao(DESISTIR, 0);
	mao->LimparMao();
	status = DESISTIU;
}

int Jogador::GetApostaTotal() {
	return apostaTotal;
}

Controlador* Jogador::GetControlador() {
	return controlador;
}

void Jogador::Passar() {
	ultimaAcao = new Acao(PASSAR, 0);
}

void Jogador::AumentarApostaPara(int valor) {
	int valorAAumentar = valor - apostaRodada;
	AumentarApostaEm(valorAAumentar);
}

void Jogador::SetControlador(Controlador *controlador) {
	this->controlador = controlador;
}

Inteligencia *Jogador::GetInteligencia() {
	return this->inteligencia;
}

void Jogador::SetInteligencia(Inteligencia *inteligencia) {
	this->inteligencia = inteligencia;
}

StatusJogador Jogador::GetStatus(){
	return this->status;
}

String Jogador::ToString(){
	String toString = "";
	toString.Append(nome);
	toString.Append("\n");

	if(ultimaAcao != null){
		toString.Append(ultimaAcao->ToString());
	}

	toString.Append("\n");
	toString.Append("Money: $");
	toString.Append(dinheiro);
	return toString;
}
